package cn.teduymdj.jxc.controller;


import cn.teduymdj.jxc.myAnnotation.LogAnnotation;
import cn.teduymdj.jxc.pojo.dto.SaleListAddNewDTO02;
import cn.teduymdj.jxc.pojo.dto.SelectReturnCondition;
import cn.teduymdj.jxc.pojo.entity.Log;
import cn.teduymdj.jxc.pojo.vo.SaleDataByDayVO;
import cn.teduymdj.jxc.pojo.vo.SaleListCountListItemVO;
import cn.teduymdj.jxc.pojo.vo.SaleListGoodsListItemVO;
import cn.teduymdj.jxc.pojo.vo.SaleListListItemVO;
import cn.teduymdj.jxc.security.LoginPrincipal;
import cn.teduymdj.jxc.service.SaleListGoodsService;
import cn.teduymdj.jxc.util.BigDecimalUtil;
import cn.teduymdj.jxc.util.DateUtil;
import cn.teduymdj.jxc.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 销售商品Controller层
 */
@Slf4j
@RestController
@RequestMapping("/saleListGoods")
public class SaleListGoodsController {

    @Autowired
    private SaleListGoodsService saleListGoodsService;


    /**
     * 保存销售单信息
     *
     * @param saleListAddNewDTO 销售单信息实体
     * @param saleListGoodsStr  销售商品信息JSON字符串
     * @return
     */
    //日志保存注解,不用管:李柯辰
    @LogAnnotation(content = "保存销售单信息", type = Log.INSERT_ACTION)
    @RequestMapping("/save")
    public JsonResult<Void> save(@RequestBody SaleListAddNewDTO02 saleListAddNewDTO) {

        saleListGoodsService.save(saleListAddNewDTO);

        return JsonResult.ok();
    }

    /**
     * 查询销售单
     *
     * @param saleNumber 单号
     * @param customerId 供应商ID
     * @param state      付款状态
     * @param sTime      开始时间
     * @param eTime      结束时间
     * @return
     */
    @LogAnnotation(content = "查询销售单", type = Log.SELECT_ACTION)
    @RequestMapping("/list")
    public JsonResult<List<SaleListListItemVO>> list(String saleNumber, String customerId, String state, String sTime,
                                                     String eTime) {


        List<SaleListListItemVO> saleListList = saleListGoodsService.getSalelist(saleNumber, customerId, state, sTime, eTime);

        return JsonResult.ok(saleListList);
    }

    /**
     * 查询销售单商品信息
     *
     * @param saleListId 销售单ID
     * @return
     */
    @LogAnnotation(content = "查询销售单商品信息", type = Log.SELECT_ACTION)
    @RequestMapping("/goodsList")
    public JsonResult<List<SaleListGoodsListItemVO>> goodsList(Long saleListId) {

        List<SaleListGoodsListItemVO> saleListGoodsList = saleListGoodsService.getSaleListGoodsBySaleListId(saleListId);

        return JsonResult.ok(saleListGoodsList);
    }

    /**
     * 删除销售单及商品信息
     *
     * @param saleListId 销售单ID
     * @return
     */
    @LogAnnotation(content = "删除销售单及商品信息", type = Log.DELETE_ACTION)
    @RequestMapping("/delete")
    public JsonResult<Void> delete(Long saleListId) {


        saleListGoodsService.delete(saleListId);

        return JsonResult.ok();

    }



    /**
     * 修改销售单付款状态
     *
     * @param id 销售单ID
     * @return
     */
    @LogAnnotation(content = "修改销售单付款状态为付款", type = Log.UPDATE_ACTION)
    @PostMapping("/{id:[0-9]+}/Paid")
    public JsonResult<Void> setPaid(@PathVariable Long id) {
        log.debug("开始处理【启用管理员】的请求，参数：{}", id);
        saleListGoodsService.setPaid(id);
        return JsonResult.ok();
    }

    /**
     * 修改进货单付款状态
     *
     * @param id 进货单ID
     * @return
     */
    @LogAnnotation(content = "修改销售单付款状态为未付款", type = Log.UPDATE_ACTION)
    @PostMapping("/{id:[0-9]+}/Unpaid")
    public JsonResult<Void> setUnpaid(@PathVariable Long id) {
        log.debug("开始处理【禁用管理员】的请求，参数：{}", id);
        saleListGoodsService.setUnpaid(id);
        return JsonResult.ok();
    }

    /**
     * 销售商品统计
     *
     * @param sTime       开始时间
     * @param eTime       结束时间
     * @param goodsTypeId 商品类别ID
     * @param codeOrName  编号或商品名称
     * @return
     */
    @LogAnnotation(content = "销售商品统计", type = Log.SELECT_ACTION)
    @RequestMapping("/count")
    public JsonResult<List<SaleListCountListItemVO>> count(SelectReturnCondition selectReturnCondition) {

        List<SaleListCountListItemVO> saleListGoodsList = saleListGoodsService
                    .getSaleListGoodsByCondition(selectReturnCondition);

        return JsonResult.ok(saleListGoodsList);

    }

    /**
     * 按日统计销售情况
     *
     * @param sTime 开始时间
     * @param eTime 结束时间
     * @return
     */
    @LogAnnotation(content = "按日统计销售情况", type = Log.SELECT_ACTION)
    @RequestMapping("/getSaleDataByDay")
    public JsonResult<ArrayList<SaleDataByDayVO>> getSaleDataByDay(String sTime, String eTime) throws Exception {


        // 获取所有的时间段日期
        List<String> dateList = DateUtil.getTimeSlotByDay(sTime, eTime);

        // 查询按日统计的数据
        List<Object> obList = saleListGoodsService.getSaleDataByDay(sTime, eTime);

        ArrayList<SaleDataByDayVO> result = new ArrayList<>();
        // 按日统计的数据，如果该日期没有数据的话，则不会有显示，我们的需求是，如果该日期没有销售数据的话，也应该显示为0，所以需要进行特殊处理
        for (String date : dateList) {

            SaleDataByDayVO data = new SaleDataByDayVO();

            boolean flag = false;

            for (Object o : obList) { //jpa默认会按sql语法查询的字段的先后顺序来将结果集进行封装成一个数组集合

                Object[] os = (Object[]) o;

                if (os[0].equals(date)) {

                    data.setDate(os[0].toString());//日期

                    data.setSaleTotal(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[1]));////销售总额

                    data.setPurchasingTotal(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[2]));//成本总额

                    data.setProfit(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[1] - (Double) os[2]));//利润

                    flag = true;

                }

            }

            if (!flag) {// 如果没有销售数据，那么也需要设置该日的销售数据默认为0
                data.setDate(date);
                data.setSaleTotal(0);
                data.setPurchasingTotal(0);
                data.setProfit(0);
            }

            result.add(data);
        }


        return JsonResult.ok(result);
    }

    /**
     * 按月统计销售情况
     *
     * @param sTime 开始时间
     * @param eTime 结束时间
     * @return
     */
    @LogAnnotation(content = "按月统计销售情况", type = Log.SELECT_ACTION)
    @RequestMapping("/getSaleDataByMonth")
    public JsonResult<ArrayList<SaleDataByDayVO>> getSaleDataByMonth(String sTime, String eTime) throws Exception {


        // 获取所有的时间段日期
        List<String> dateList = DateUtil.getTimeSlotByMonth(sTime, eTime);

        // 查询按日统计的数据
        List<Object> obList = saleListGoodsService.getSaleDataByMonth(sTime, eTime);

        // 按日统计的数据，如果该日期没有数据的话，则不会有显示，我们的需求是，如果该日期没有销售数据的话，也应该显示为0，所以需要进行特殊处理
        ArrayList<SaleDataByDayVO> result = new ArrayList<>();
        // 按日统计的数据，如果该日期没有数据的话，则不会有显示，我们的需求是，如果该日期没有销售数据的话，也应该显示为0，所以需要进行特殊处理
        for (String date : dateList) {

            SaleDataByDayVO data = new SaleDataByDayVO();

            boolean flag = false;

            for (Object o : obList) { //jpa默认会按sql语法查询的字段的先后顺序来将结果集进行封装成一个数组集合

                Object[] os = (Object[]) o;

                if (os[0].equals(date)) {

                    data.setDate(os[0].toString());//日期

                    data.setSaleTotal(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[1]));////销售总额

                    data.setPurchasingTotal(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[2]));//成本总额

                    data.setProfit(BigDecimalUtil.keepTwoDecimalPlaces((Double) os[1] - (Double) os[2]));//利润

                    flag = true;

                }

            }

            if (!flag) {// 如果没有销售数据，那么也需要设置该日的销售数据默认为0
                data.setDate(date);
                data.setSaleTotal(0);
                data.setPurchasingTotal(0);
                data.setProfit(0);
            }

            result.add(data);
        }


        return JsonResult.ok(result);
    }

}
